package com.lg.java.reference;

/**
 *   1 Java虚拟机一旦通过刚才提到的“根搜索算法”判断出某对象处于可回收状态时，会判断该对象是否重写了Object类的finalize方法，如果没，则直接回收。
 *
 *   2 如重写过finalize方法，而且未执行过该方法，则把该对象其放入F-Queue队列，另个线程会定时遍历F-Queue队列，并执行该队列中各对象的finalize方法。
 *
 *   3 finalize方法执行完毕后，GC会再次判断该对象是否可被回收，如果可以，则进行回收，如果此时该对象上有强引用，则该对象“复活”，即处于“不可回收状态”。
 */
public class FinalizeTest {

    static FinalizeTest obj = null;
    //重写Object里的finalize方法

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("In finalize()");
        obj = this; //给obj加个强引用
    }

    public static void main(String[] args) throws InterruptedException {
        obj = new FinalizeTest();
        obj = null; //去掉强引用
        System.gc(); //垃圾回收
        //sleep 1秒，以便垃圾回收线程清理obj对象
        Thread.sleep(1000);
        if (null != obj) { //在finalize方法复活
            System.out.println("Still alive.");
        } else {
            System.out.println("Not alive.");
        }
    }
}
